home *** CD-ROM | disk | FTP | other *** search
-
- ; SETJMP.A
- ;
- ; (c)Copyright 1990-91, Matthew Dillon, All Rights Reserved
- ;
- ; revised to add current __stk_base
-
- section text,code
-
- xdef _setjmp
- xdef _longjmp
- xref __stk_base
- xref __CStackFree
- xref __AbortLockout
-
- _setjmp
- move.l 4(sp),A0 ; jmp_buf (16 longwords)
- move.l (sp),A1 ; return address
- movem.l D2-D7/A1-A7,(A0)
- move.l __stk_base(A4),52(A0) ;[4] = current stk base
- moveq.l #0,D0 ; direct call returns 0
- rts
-
- _longjmp
- move.w #0,__AbortLockout(A4) ; clear abort lockout
- addq.l #4,sp ; skip rts
- move.l (sp)+,A2 ; jmp_buf
- move.l (sp)+,D2 ; ret-value, disallow 0
- bne lj0
- moveq.l #1,D2
- lj0 move.l 48(A2),A7 ; restore stack immediately
- move.l 52(A2),A3 ; original stack base
- lj1 cmp.l __stk_base(A4),A3
- beq lj10
- jsr __CStackFree(pc) ; free stacks until ok
- bra lj1
- lj10
- move.l A2,A0 ; restore frame
- move.l D2,D0
- movem.l (A0),D2-D7/A1-A7
- move.l A1,(sp) ; set up return address
- rts
-
- END
-
-